Aims to understand how neural networks perceive images
Evolved in response to a desire to make neural nets more interpretable
For latest developments: brilliant series of articles on Distill
First introduced in 2013
Indications of the most “salient” regions of an image
Focus on the gradients of output category (target class) w.r.t. input image
Small changes in pixels with positive gradients will increase in the probability of target class
Visualising the gradients provides some intuition of attention
from flashtorch.utils import load_image
image = load_image('../../examples/images/great_grey_owl_01.jpg')
plt.imshow(image)
plt.title('Original image')
plt.axis('off');
from flashtorch.utils import apply_transforms, denormalize, format_for_plotting
input_ = apply_transforms(image)
print(f'Before: {type(image)}')
print(f'After: {type(input_)}, {input_.shape}')
plt.imshow(format_for_plotting(denormalize(input_)))
plt.title('Input tensor')
plt.axis('off');
Before: <class 'PIL.Image.Image'> After: <class 'torch.Tensor'>, torch.Size([1, 3, 224, 224])
from flashtorch.saliency import Backprop
model = models.alexnet(pretrained=True)
backprop = Backprop(model)
Signature:
backprop.calculate_gradients(input_, target_class=None, take_max=False)
from flashtorch.utils import ImageNetIndex
imagenet = ImageNetIndex()
target_class = imagenet['great grey owl']
print(f'Traget class index: {target_class}')
gradients = backprop.calculate_gradients(input_, target_class)
max_gradients = backprop.calculate_gradients(input_, target_class, take_max=True)
print(type(gradients), gradients.shape)
print(type(max_gradients), max_gradients.shape)
Traget class index: 24 <class 'torch.Tensor'> torch.Size([3, 224, 224]) <class 'torch.Tensor'> torch.Size([1, 224, 224])
from flashtorch.utils import visualize
visualize(input_, gradients, max_gradients)
Additional guidance from the higher layers during backprop
Masks out neurons for which at least one of below is negative
Prevents the flow of gradients i.e. neurons which decrease activation of layer of interest
guided_gradients = backprop.calculate_gradients(input_, target_class, guided=True)
max_guided_gradients = backprop.calculate_gradients(input_, target_class, take_max=True, guided=True)
visualize(input_, guided_gradients, max_guided_gradients)
visualize(input_, guided_gradients, max_guided_gradients)
visualize(input_, guided_gradients, max_guided_gradients)
A model developed for a task is reused as a starting point for another task
Pre-trained models often used in computer visions & natural language processing tasks
Save compute & time resources
image = load_image('../../examples/images/foxglove.jpg')
plt.imshow(image)
plt.title('Foxglove')
plt.axis('off');
backprop = Backprop(pretrained_model)
guided_gradients = backprop.calculate_gradients(input_, class_index, guided=True)
guided_max_gradients = backprop.calculate_gradients(input_, class_index, take_max=True, guided=True)
visualize(input_, guided_gradients, guided_max_gradients)
/Users/misao/Projects/personal/flashtorch/flashtorch/saliency/backprop.py:93: UserWarning: The predicted class does not equal the
target class. Calculating the gradient with respect to the
predicted class.
predicted class.'''))
backprop = Backprop(trained_model)
guided_gradients = backprop.calculate_gradients(input_, class_index, guided=True)
guided_max_gradients = backprop.calculate_gradients(input_, class_index, take_max=True, guided=True)
visualize(input_, guided_gradients, guided_max_gradients)
Checkout FlashTorch 🔦
Please comment & feedback on the talk 🙏
Suggestions & contributions welcome 🤝